feat(tui): add Claude Code-style --fork flag to duplicate sessions before continuing (resolves #11137)#11340
Conversation
- Add --fork CLI flag for session forking with --continue or --session - Forked sessions get automatic (fork #N) title suffix via existing Session.fork() - Validate that --fork requires --continue or --session - Applies to both attach mode and bootstrap mode Fixes anomalyco#11137
- Add fork option to Args interface - Add --fork-session flag to TUI command (thread.ts) - Add validation that --fork-session requires --continue or --session - Fork session before navigating when --fork-session is set
Replace verbose if/else if blocks with ternary expressions to match repo style guide preference for const over let. -8 lines total
When using --session with --fork, the app would briefly show the forked session then navigate to a blank screen. Root cause: race condition where reconcile overwrites the newly forked session from the store. Fix: Wait for sync.status to be "complete" before forking, ensuring session list is fully loaded before the fork operation.
|
The following comment was made by an LLM, it may be inaccurate: No duplicate PRs found |
|
A few comments exchanged between @IdrisGit and myself on the topic of this PR can be found alongside my initial dummy PR, located here: ariane-emory#147 |
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
… to duplicate sessions before continuing (resolves #11137)
71151ae to
4410d8b
Compare
Remove the alias and make --fork the primary CLI option name. Update args.forkSession references to args.fork.
|
/review |
| toast.show({ message: "Failed to fork session", variant: "error" }) | ||
| } | ||
| }) | ||
| } else { |
There was a problem hiding this comment.
Suggestion (not a violation): The fork logic with error handling appears twice (here and again at line 293). Consider extracting a helper function to reduce duplication, e.g.:
const forkAndNavigate = (sessionID: string) => {
sdk.client.session.fork({ sessionID }).then((result) => {
if (result.data?.id) {
route.navigate({ type: "session", sessionID: result.data.id })
} else {
toast.show({ message: "Failed to fork session", variant: "error" })
}
})
}This is just a DRY suggestion - the current code works correctly.
|
lgtm The code follows the style guide well - uses early returns, const over let where appropriate, and the logic is clean. The only suggestion I left was about potential code duplication in app.tsx which is just a DRY consideration, not a requirement. |
What does this PR do?
--fork-sessionswitch offer familiarity to converts from Claude Code./forkcommand or TUI message modal receive--forkis correctly paired with either--continueor--sessionopencode runcommandsResolves #11137.
Supported syntax examples:
opencode --continue --forkStart the TUI, continuing and forking (duplicating) the last session
opencode run --continue --fork "tell me a better joke"Run one prompt, continuing and forking (duplicating) the last session
opencode run --fork "tell me a better joke"Same as previous, but using terse syntax for the --continue switch
opencode --fork --session ses_3f2424a04ffeu0ZUiE12HfD2OIFork a particular session.
opencode --fork --session ses_that_doesnt_existFails gracefully: OpenCode starts, but displays a
Failed to fork sessiontoast.opencode run --fork --session ses_that_doesnt_exist "I'm not gonna work."Fails gracefully: an
Error: Session not foundmessage is written to STDERR and an exit code of 1 is used.How did you verify your code works?
Manual testing,
bun test,bun typecheck